package _4Game;

import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import _3TCPChat.ChatServerFrame;

public class GameServer {

	// 服务器端口
	int port = 8888;

	// 界面窗体
	GameServerFrame f;

	// 容器存放所有连接上的客户端的Socket
	List<Socket> clients = new ArrayList<>();
	
	// 游戏对象
	SnakeGame sg;

	// 启动服务器
	public void start() {

		// 开启一个新的子线程，在子线程中启动服务器，不会卡主界面
		Thread t = new Thread(new Runnable() {

			@Override
			public void run() {

				// 1. 创建服务器Scoket
				ServerSocket serSocket;
				try {
					f.showMsg("开启服务器,端口:" + port);
					serSocket = new ServerSocket(port);
				} catch (IOException e) {
					f.showMsg("出错了:" + e.getMessage());
					return;
				}

				// 2. 不断监听端口，等待客户端连接
				while (true) {
					try {

						f.showMsg("监听端口,等待客户连入...");
						Socket s = serSocket.accept();

						// 3. 显示客户端信息
						f.showMsg("客户端连入" + s.getInetAddress() + ":" + s.getPort());
						
						// 往游戏中放入一条蛇
						sg.addSnake(s);

						// 处理当前连入的客户端Scoket
						handleScoket(s);

						// 加入到客户端里里列表
						clients.add(s);

						f.showMsg("当前在线用户:" + clients.size());


					} catch (IOException e) {
						f.showMsg("出错了:" + e.getMessage());
					}
				}
			}
		});
		t.start();

	}



	// 处理某个连入的客户端Socket
	protected void handleScoket(Socket s) {
		// 开子线程不停读取这个客户端发来的信息

		Thread t = new Thread(new Runnable() {

			@Override
			public void run() {

				// 从socket得到输入流
				InputStream in = null;
				try {
					in = s.getInputStream();
				} catch (IOException e1) {
					return;
				}
				while (true) {
					try 
					{
						int d = in.read();
						System.out.println(d);
						
						// 通过map获取到蛇
						Snake snake = sg.map.get(s);
						// 修改蛇的移动方向
						snake.direction = d;
						
					} catch (IOException e) {
						break;
					}
					
				}
				f.showMsg(s.getInetAddress() + "[" + s.getPort() + "]:客户端断开或出错了");

				// 从客户端列表中移出
				clients.remove(s);
				f.showMsg("当前在线用户:" + clients.size());



			}
		});
		t.start();

	}
	
	Map<Socket,ObjectOutputStream> map2=new HashMap<>();
	
	public void sendMap(Map<Socket,Snake> map)
	{
		ArrayList<Snake> snakes = new ArrayList<>();
//		snakes.addAll(map.values()); 不行
		// 每次发送的对象必须是新建的对象		
		for(Snake s:map.values())
		{
			snakes.add(s.copy());
		}

		
		System.out.println(snakes);
		for(Socket s:clients)
		{
			// 对象流不能重复创建
			// ??
			ObjectOutputStream out = map2.get(s);
			if(out==null)
			{
				// 新建对象流
				try {
					out = new ObjectOutputStream(s.getOutputStream());
					map2.put(s, out);
					
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}	
			}
			try {
				int x = (int)(Math.random()*1000);
				System.out.println(x);
				out.writeObject(new Integer(x));
				out.writeObject(snakes);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
	}
}
